/**
 * 扫描views目录下的Vue组件，提取template标签上的funcCode和name属性
 * 只有同时包含这两个属性的组件才会被收集
 */
const fs = require("fs");
const path = require("path");

// 命令行参数解析
const args = process.argv.slice(2);
const argMap = {};
args.forEach((arg) => {
  if (arg.startsWith("--")) {
    const [key, value] = arg.slice(2).split("=");
    argMap[key] = value || true;
  }
});

// 配置项
const config = {
  // views目录的路径
  viewsDir: argMap.dir || path.join(__dirname, "../src/views"),
  // 输出文件路径
  outputFile: argMap.output || path.join(__dirname, "route.json"),
  // 是否输出到控制台
  logToConsole: argMap.log !== "false",
  // 排除的目录
  excludeDirs: (argMap.exclude || "").split(",").filter(Boolean),
};

// 存储结果的数组
const components = [];

/**
 * 递归扫描目录，查找所有Vue组件
 * @param {string} dir 要扫描的目录
 * @param {string} relativePath 相对于views的路径
 */
function scanDirectory(dir, relativePath = "") {
  try {
    const files = fs.readdirSync(dir);

    files.forEach((file) => {
      const fullPath = path.join(dir, file);
      const stat = fs.statSync(fullPath);

      // 如果是目录，则递归扫描（除非在排除列表中）
      if (stat.isDirectory()) {
        if (!config.excludeDirs.includes(file)) {
          scanDirectory(fullPath, path.join(relativePath, file));
        }
      }
      // 如果是Vue文件，则提取组件信息
      else if (file.endsWith(".vue")) {
        const componentInfo = extractComponentInfo(
          fullPath,
          file,
          relativePath,
        );
        if (componentInfo) {
          components.push(componentInfo);
        }
      }
    });
  } catch (error) {
    console.error(`Error scanning directory ${dir}:`, error);
  }
}

/**
 * 从Vue文件中提取组件信息
 * @param {string} filePath Vue文件的完整路径
 * @param {string} fileName 文件名
 * @param {string} relativePath 相对路径
 * @returns {Object|null} 组件信息对象，如果不包含所需属性则返回null
 */
function extractComponentInfo(filePath, fileName, relativePath) {
  try {
    const content = fs.readFileSync(filePath, "utf-8");
    const componentPath = path.join(relativePath, fileName);
    const normalizedPath = componentPath.replace(/\\/g, "/"); // 确保路径使用正斜杠

    // 提取template标签
    const templateMatch = content.match(
      /<template[^>]*>([\s\S]*?)<\/template>/,
    );
    if (!templateMatch) {
      return null; // 没有template标签
    }

    // 检查template标签是否包含funcCode和name属性
    const templateTag = templateMatch[0].split(">")[0]; // 获取开始标签
    const funcCodeMatch = templateTag.match(/funcCode\s*=\s*["']([^"']*)["']/);
    const nameMatch = templateTag.match(/name\s*=\s*["']([^"']*)["']/);
    const autoRouteMatch = templateTag.match(/autoRoute="([^"]*)"/);
    const noRequireLayoutMatch = templateTag.match(/noRequireLayout="([^"]*)"/);
    if ((!funcCodeMatch || !nameMatch) && !autoRouteMatch) {
      return null; // 不包含所需属性
    }

    // 提取属性值
    const funcCode =
      funcCodeMatch && funcCodeMatch.length >= 2 ? funcCodeMatch[1] : "";
    const name = nameMatch && nameMatch.length >= 2 ? nameMatch[1] : "";
    const noRequireLayout =
      noRequireLayoutMatch && noRequireLayoutMatch.length >= 2
        ? noRequireLayoutMatch[1]
        : "";
    // 生成routePath（移除.vue后缀）
    let routePath = normalizedPath.replace(/\.vue$/, "");
    // 如果是index文件，简化路径
    routePath = routePath.replace(/\/index$/, "");
    // 添加/uap-app前缀
    routePath = "/uap-app/" + routePath.replace(/^\//, "");

    // 返回调整后的组件信息
    return {
      funcCode,
      name,
      routePath,
      routeComponent: normalizedPath,
      noRequireLayout,
    };
  } catch (error) {
    console.error(`Error extracting info from ${filePath}:`, error);
    return null;
  }
}

/**
 * 主函数
 */
function main() {
  try {
    // 检查views目录是否存在
    if (!fs.existsSync(config.viewsDir)) {
      console.error(`Views directory not found: ${config.viewsDir}`);
      return;
    }

    console.log(`Scanning directory: ${config.viewsDir}`);

    // 扫描views目录
    scanDirectory(config.viewsDir);

    // 构建结果对象
    const result = {
      total: components.length,
      components: components,
    };

    // 转换为JSON字符串，使用2个空格缩进
    const jsonOutput = JSON.stringify(result, null, 2);

    // 输出结果
    if (config.outputFile) {
      fs.writeFileSync(config.outputFile, jsonOutput);
    }
    console.log(
      `Total components found with funcCode and name: ${components.length}`,
    );
  } catch (error) {
    console.error("Error:", error);
  }
}

// 执行主函数
main();
